module rf_cell( data_out,
                data_in,
                en,
                clk,
                rst );

    input en, clk, rst;
    input[15:0] data_in;
    
    output[15:0] data_out;
    wire[15:0] d_in;

    dff ff0( .q(data_out[0]), .d(d_in[0]), .clk(clk), .rst(rst) );
    dff ff1( .q(data_out[1]), .d(d_in[1]), .clk(clk), .rst(rst) );
    dff ff2( .q(data_out[2]), .d(d_in[2]), .clk(clk), .rst(rst) );
    dff ff3( .q(data_out[3]), .d(d_in[3]), .clk(clk), .rst(rst) );
    
    dff ff4( .q(data_out[4]), .d(d_in[4]), .clk(clk), .rst(rst) );
    dff ff5( .q(data_out[5]), .d(d_in[5]), .clk(clk), .rst(rst) );
    dff ff6( .q(data_out[6]), .d(d_in[6]), .clk(clk), .rst(rst) );
    dff ff7( .q(data_out[7]), .d(d_in[7]), .clk(clk), .rst(rst) );
    
    dff ff8( .q(data_out[8]), .d(d_in[8]), .clk(clk), .rst(rst) );
    dff ff9( .q(data_out[9]), .d(d_in[9]), .clk(clk), .rst(rst) );
    dff ff10( .q(data_out[10]), .d(d_in[10]), .clk(clk), .rst(rst) );
    dff ff11( .q(data_out[11]), .d(d_in[11]), .clk(clk), .rst(rst) );
    
    dff ff12( .q(data_out[12]), .d(d_in[12]), .clk(clk), .rst(rst) );
    dff ff13( .q(data_out[13]), .d(d_in[13]), .clk(clk), .rst(rst) );
    dff ff14( .q(data_out[14]), .d(d_in[14]), .clk(clk), .rst(rst) );
    dff ff15( .q(data_out[15]), .d(d_in[15]), .clk(clk), .rst(rst) );
    
    assign d_in = (en)? data_in : data_out;
endmodule
